package com.lan.util;


import com.lan.model.Type;
import com.lan.model.type.PrimitiveType;

public class Utils {

    ///////////////////////////////////////////////////////////
    //内置函数


    ///////////////////////////////////////////////////////////
    /// 各种运算
    public static Object add(Object o1, Object o2) {
        if (TypeUtils.isInteger(o1) && TypeUtils.isInteger(o2)) {
            return ((Number) o1).intValue() + ((Number) o2).intValue();
        } else if (TypeUtils.isLong(o1) && TypeUtils.isLong(o2)) {
            return ((Number) o1).longValue() + ((Number) o2).longValue();
        } else if (TypeUtils.isDouble(o1) && TypeUtils.isDouble(o2)) {
            return ((Number) o1).doubleValue() + ((Number) o2).doubleValue();
        } else if (TypeUtils.isString(o1) || TypeUtils.isString(o2)) {
            String l;
            if (TypeUtils.isString(o1)) {
                l = (String) o1;
            } else {
                l = o1.toString();
            }

            String r;
            if (TypeUtils.isString(o2)) {
                r = (String) o2;
            } else {
                r = o2.toString();
            }

            return l + r;
        }
        return null;
    }

    public static Object sub(Object o1, Object o2) {
        if (TypeUtils.isInteger(o1) && TypeUtils.isInteger(o2)) {
            return ((Number) o1).intValue() - ((Number) o2).intValue();
        } else if (TypeUtils.isLong(o1) && TypeUtils.isLong(o2)) {
            return ((Number) o1).longValue() - ((Number) o2).longValue();
        } else if (TypeUtils.isDouble(o1) && TypeUtils.isDouble(o2)) {
            return ((Number) o1).doubleValue() - ((Number) o2).doubleValue();
        }
        return null;
    }

    public static Object mul(Object o1, Object o2) {
        if (TypeUtils.isInteger(o1) && TypeUtils.isInteger(o2)) {
            return ((Number) o1).intValue() * ((Number) o2).intValue();
        } else if (TypeUtils.isLong(o1) && TypeUtils.isLong(o2)) {
            return ((Number) o1).longValue() * ((Number) o2).longValue();
        } else if (TypeUtils.isDouble(o1) && TypeUtils.isDouble(o2)) {
            return ((Number) o1).doubleValue() * ((Number) o2).doubleValue();
        }
        return null;
    }

    public static Object div(Object o1, Object o2) {
        if (TypeUtils.isInteger(o1) && TypeUtils.isInteger(o2)) {
            return ((Number) o1).intValue() / ((Number) o2).intValue();
        } else if (TypeUtils.isLong(o1) && TypeUtils.isLong(o2)) {
            return ((Number) o1).longValue() / ((Number) o2).longValue();
        } else if (TypeUtils.isDouble(o1) && TypeUtils.isDouble(o2)) {
            return ((Number) o1).doubleValue() / ((Number) o2).doubleValue();
        }
        return null;
    }

    public static Boolean EQ(Object o1, Object o2) {
        if (TypeUtils.isInteger(o1) && TypeUtils.isInteger(o2)) {
            return ((Number) o1).intValue() == ((Number) o2).intValue();
        } else if (TypeUtils.isLong(o1) && TypeUtils.isLong(o2)) {
            return ((Number) o1).longValue() == ((Number) o2).longValue();
        } else if (TypeUtils.isDouble(o1) && TypeUtils.isDouble(o2)) {
            return ((Number) o1).doubleValue() == ((Number) o2).doubleValue();
        }
        return null;
    }

    public static Boolean NotEq(Object o1, Object o2) {
        if (TypeUtils.isInteger(o1) && TypeUtils.isInteger(o2)) {
            return ((Number) o1).intValue() != ((Number) o2).intValue();
        } else if (TypeUtils.isLong(o1) && TypeUtils.isLong(o2)) {
            return ((Number) o1).longValue() != ((Number) o2).longValue();
        } else if (TypeUtils.isDouble(o1) && TypeUtils.isDouble(o2)) {
            return ((Number) o1).doubleValue() != ((Number) o2).doubleValue();
        }
        return null;
    }

    public static Object GE(Object o1, Object o2) {
        if (TypeUtils.isInteger(o1) && TypeUtils.isInteger(o2)) {
            return ((Number) o1).intValue() >= ((Number) o2).intValue();
        } else if (TypeUtils.isLong(o1) && TypeUtils.isLong(o2)) {
            return ((Number) o1).longValue() >= ((Number) o2).longValue();
        } else if (TypeUtils.isDouble(o1) && TypeUtils.isDouble(o2)) {
            return ((Number) o1).doubleValue() >= ((Number) o2).doubleValue();
        }
        return null;
    }

    public static Object GT(Object o1, Object o2) {
        if (TypeUtils.isInteger(o1) && TypeUtils.isInteger(o2)) {
            return ((Number) o1).intValue() > ((Number) o2).intValue();
        } else if (TypeUtils.isLong(o1) && TypeUtils.isLong(o2)) {
            return ((Number) o1).longValue() > ((Number) o2).longValue();
        } else if (TypeUtils.isDouble(o1) && TypeUtils.isDouble(o2)) {
            return ((Number) o1).doubleValue() > ((Number) o2).doubleValue();
        }
        return null;
    }

    public static Object LE(Object o1, Object o2) {
        if (TypeUtils.isInteger(o1) && TypeUtils.isInteger(o2)) {
            return ((Number) o1).intValue() <= ((Number) o2).intValue();
        } else if (TypeUtils.isLong(o1) && TypeUtils.isLong(o2)) {
            return ((Number) o1).longValue() <= ((Number) o2).longValue();
        } else if (TypeUtils.isDouble(o1) && TypeUtils.isDouble(o2)) {
            return ((Number) o1).doubleValue() <= ((Number) o2).doubleValue();
        }
        return null;
    }

    public static Object LT(Object o1, Object o2) {
        if (TypeUtils.isInteger(o1) && TypeUtils.isInteger(o2)) {
            return ((Number) o1).intValue() < ((Number) o2).intValue();
        } else if (TypeUtils.isLong(o1) && TypeUtils.isLong(o2)) {
            return ((Number) o1).longValue() < ((Number) o2).longValue();
        } else if (TypeUtils.isDouble(o1) && TypeUtils.isDouble(o2)) {
            return ((Number) o1).doubleValue() < ((Number) o2).doubleValue();
        }
        return null;
    }

    public static Object INC(Object value) {
        if (TypeUtils.isInteger(value)) {
            return ((Integer) value).intValue() + 1;
        } else if (TypeUtils.isLong(value)) {
            return ((Long) value).longValue() + 1;
        } else if (TypeUtils.isDouble(value)) {
            return ((Double) value).doubleValue() + 1;
        }
        return null;

    }

    public static Object DEC(Object value) {
        if (TypeUtils.isInteger(value)) {
            return ((Integer) value).intValue() - 1;
        } else if (TypeUtils.isLong(value)) {
            return ((Long) value).longValue() - 1;
        } else if (TypeUtils.isDouble(value)) {
            return ((Double) value).doubleValue() - 1;
        }
        return null;
    }
}
